分类
联系方式
  1. 新浪微博
  2. E-mail

Flutter tonic DartState

介绍

tonic 是一个 C++ 工具库,对 DartVM API 进行了一些简化和封装。

DartState 与一个具体的 Dart Isolate 想关联。持有 DartState 就相当于持有了 Isolate,并且 tonic 建议采用弱引用持有。

注意一个细节:在 DartVM 之外,对 Isolate 的引用类是 Dart_Isolate。

核心成员

DartState 有几个核心成员,代表了 Isolate 的核心能力。

DartClassLibrary

跨层从 C/C++ 访问 Dart 中的一些类,tonic 提供了一个抽象模块,统一管理。

DartMessageHandler

DartMessageHandler 也是 tonic 提供的封装,而并非 DartVM 中的 Isolate MessageHandler。

DartMessageHandler 通过回调注入的方式,提供了对消息队列的响应。

FileLoader

tonic 提供的跨平台文件加载模块。

DartMessageHandler 使用场景

UIDartState::GetLastError,获取 Isolate 的最后一次报错:

tonic::DartErrorHandleType UIDartState::GetLastError() {
  tonic::DartErrorHandleType error = message_handler().isolate_last_error();
  if (error == tonic::kNoError) {
    error = microtask_queue_.GetLastError();
  }
  return error;
}

DartIsolate 设置 MessageHandlingTaskRunner,这是一个非常核心的行为:

void DartIsolate::SetMessageHandlingTaskRunner(
    fml::RefPtr<fml::TaskRunner> runner) {
  if (!IsRootIsolate() || !runner) {
    return;
  }

  message_handling_task_runner_ = runner;

  message_handler().Initialize([runner](std::function<void()> task) {
    auto task_queues = fml::MessageLoopTaskQueues::GetInstance();
    task_queues->RegisterTask(
        runner->GetTaskQueueId(),
        [task = std::move(task)]() {
          task();
        },
        fml::TimePoint::Now(), fml::TaskSourceGrade::kDartMicroTasks);
  });
}